package comun;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import javax.net.ssl.SSLSocket;

/**
 * 
 * @author Eliana - Matias
 *
 * id sesion:
 * id tema:
 * tipo msj:
 * contenido:
 * 
 */
public class Lector_socket {
	private final static String FIN_CONTENIDO = "--- fin contenido ---";
	
	private SSLSocket socket;
	private BufferedWriter salida;
	private BufferedReader entrada;
	
	public Lector_socket(SSLSocket s){
		socket=s;
		try{
			salida = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		    entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		}catch(Exception e){}
	}
	/*
	public Mensaje leer_msj(){
		String cadena_leida;
		Mensaje msj=new Mensaje();
		try{
			
				
			for(int i=1; i<=4; i++){
				cadena_leida = entrada.readLine();
				int primero = cadena_leida.indexOf(':',0);
				String valor= cadena_leida.substring(primero+1, cadena_leida.length());
				
				switch (i){
					case 1:{msj.setId_sesion(valor); break;}
					case 2:{msj.setId_tema(valor); break;}
					case 3:{msj.setTipo_msj(valor); break;}
					case 4:{msj.setContenido(valor); break;}
				}
				
				
			}
		}catch(Exception e){
			
		}
		return msj;
	}
	
	public void enviar_msj(Mensaje msj){
		try{
			String msj_enviar="id_sesion:"+msj.getId_sesion();
			
			salida.write(msj_enviar,0,msj_enviar.length());
			salida.newLine();
			salida.flush();
			
			msj_enviar="id_tema:"+msj.getId_tema();
			
			salida.write(msj_enviar,0,msj_enviar.length());
			salida.newLine();
			salida.flush();
			
			msj_enviar="tipo_msj:"+msj.getTipo_msj();
			
			salida.write(msj_enviar,0,msj_enviar.length());
			salida.newLine();
			salida.flush();
			
			msj_enviar="contenido:"+msj.getContenido();
			
			salida.write(msj_enviar,0,msj_enviar.length());
			salida.newLine();
			salida.flush();
			
		}catch(Exception e){}
		
	}
	*/
	/**
	 *  M�todo que lee datos de un socket y devuelve un objeto del tipo Mensaje en base a la informaci�n obtenida.
	 *  En caso de que la conexi�n de corte de manera abrupta devuelve null.
	 * @return instancia de clase Mensaje o null si se cort� la conexi�n con el otro extremo.
	 */
	public Mensaje leer_msj(){
		String cadena_leida;
		Mensaje msj=new Mensaje();
		try{
			int i=1;
			boolean terminar = false;
			StringBuffer sb = new StringBuffer();
			while(!terminar){
				cadena_leida = entrada.readLine();
				
				if(cadena_leida!=null){ 
					String valor;
					if(i<=4){
						int primero = cadena_leida.indexOf(':',0);
						valor= cadena_leida.substring(primero+1, cadena_leida.length());
					}else{
						valor=cadena_leida;
					}
					
					switch (i){
						case 1:{msj.setId_sesion(valor); break;}
						case 2:{msj.setId_tema(valor); break;}
						case 3:{msj.setTipo_msj(valor); break;}
						default:{
							//msj.setContenido(valor);
							if(valor.equals(FIN_CONTENIDO)){
								terminar=true;
								sb.deleteCharAt(sb.length()-1);
							}else{
								sb.append(valor+"\n");
							}
							break;
						}
					} // end -switch(i)
					i++;
				}else{ // cadena_leida es null (significa que se cort� la conexi�n, pero en el caso que del otro extremo se cort� la conexi�n)
					msj = null;
					terminar=true;
				}
			} // end - while(!terminar)
			
			if(msj!=null)
				msj.setContenido(sb.toString());
			
		}catch(Exception e){ // atajo el corte abrupto
			System.err.println("PROBLEMA CON EL SOCKET: "+e.getMessage());
			//e.printStackTrace();
			return null;
		}
		return msj;
	}
	
	public void enviar_msj(Mensaje msj){
		try{
			String msj_enviar="id_sesion:"+msj.getId_sesion();
			
			salida.write(msj_enviar,0,msj_enviar.length());
			salida.newLine();
			salida.flush();
			
			msj_enviar="id_tema:"+msj.getId_tema();
			
			salida.write(msj_enviar,0,msj_enviar.length());
			salida.newLine();
			salida.flush();
			
			msj_enviar="tipo_msj:"+msj.getTipo_msj();
			
			salida.write(msj_enviar,0,msj_enviar.length());
			salida.newLine();
			salida.flush();
			
			msj_enviar="contenido:"+msj.getContenido();
			
			salida.write(msj_enviar,0,msj_enviar.length());
			salida.newLine();
			salida.write(FIN_CONTENIDO,0,FIN_CONTENIDO.length());
			salida.newLine();
			salida.flush();
			
		}catch(Exception e){}
		
	}
	
	public void cerrar(){
		try{
			entrada.close();
			salida.close();
			socket.close();
		}catch(Exception e){
			
		}
	}
	
	

}
